package msg2nats

import (
	"fmt"
	"gitee.com/ichub/gofactroy/common/ichubbase"
	"github.com/nats-io/nats.go"
)

const DEFAULT_VERSION = "V1"

type NatsManager struct {
	Nc *nats.Conn

	Mapnats map[string]func(m *nats.Msg)
	mapmsgs map[string]*NatsMessage
}

func (nm *NatsManager) Register(topic string, f func(m *nats.Msg)) {
	nm.Mapnats[topic] = f
}

func (nm *NatsManager) getMessage(topic string) *NatsMessage {
	if nm.mapmsgs[topic] == nil {
		nm.mapmsgs[topic] = &NatsMessage{}
	}
	return nm.mapmsgs[topic]
}

func (nm *NatsManager) Ini() {
	nm.Mapnats = make(map[string]func(m *nats.Msg))
	nm.mapmsgs = make(map[string]*NatsMessage)
}

func (nm *NatsManager) Publish(msg NatsMessage) error {
	msg.Header.Ini()
	if msg.CheckTopicExist() {
		err := nm.Nc.Publish(msg.GetTopic(), []byte(msg.String()))
		fmt.Println("publish " + msg.GetTopic())
		return err
	}
	return &ichubbase.CmsError{500, "主题未定义:" + msg.GetTopic()}
}

func (nm *NatsManager) PublishData(msg NatsMessage, data []byte) error {
	if msg.CheckTopicExist() {
		nm.Nc.Publish(msg.GetTopic(), data)
		//fmt.Println("publish "+nm.Message.GetTopic())
		return nil
	}
	return &ichubbase.CmsError{500, "主题未定义:" + msg.GetTopic()}
}

func (nm *NatsManager) Subscribe(Topic string) error {
	msg := nm.getMessage(Topic)

	msg.Header.Topic = Topic
	if msg.CheckTopicExist() {

		nm.Nc.Subscribe(msg.GetTopic(), func(m *nats.Msg) {
			if nm.Mapnats[Topic] != nil {
				go nm.Mapnats[Topic](m)
			}
		})
		fmt.Println("Subscribe " + msg.GetTopic())
		return nil
	}
	return &ichubbase.CmsError{500, "主题未定义:" + msg.GetTopic()}
}
